package com.itnoob.controller;

import com.itnoob.component.AccessDecisionManager;
import com.itnoob.component.AccessDecisionVoter;
import com.itnoob.domain.Request;
import com.itnoob.domain.User;
import com.itnoob.mockdata.DataProvider;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

// 控制器类，用于模拟接收用户的请求，并调用AccessDecisionManager进行权限验证
// 这里使用了@RestController注解，让Spring容器管理这个类的实例，并将返回值转换为JSON格式
@RestController
public class UserController {
    // 使用@Autowired注解，让Spring容器自动注入DataProvider实例
    @Autowired
    private DataProvider dataProvider;
 
    // 使用@Autowired注解，让Spring容器自动注入AccessDecisionManager实例
    @Autowired
    private AccessDecisionManager accessDecisionManager;
 
    // 使用@RequestMapping注解，映射请求路径和方法
    @RequestMapping(value = "/api/user/list", method = RequestMethod.GET)
    public String listUsers(String username, String password) {
        // 模拟从请求中获取用户名和密码
        // 根据用户名从DataProvider中获取用户对象
        User user = getUser(username, password);
        if (user == null) return "用户名或密码错误";
        // 根据请求路径从DataProvider中获取请求对象
        Request request = dataProvider.getRequestByPath("/api/user/list");
        // 调用AccessDecisionManager的vote方法进行权限验证
        int result = accessDecisionManager.vote(user, request);
        // 如果结果是通过，则返回成功信息
        if (result == AccessDecisionVoter.ACCESS_GRANTED) {
            return "查询用户列表成功";
        }
        // 否则返回失败信息
        return "没有权限查询用户列表";
    }
 
    @RequestMapping(value = "/api/user/add", method = RequestMethod.POST)
    public String addUser(String username, String password) {
        User user = getUser(username, password);
        if (user == null) return "用户名或密码错误";

        // 根据请求路径从DataProvider中获取请求
        Request request = dataProvider.getRequestByPath("/api/user/add");
        // 调用AccessDecisionManager的vote方法进行权限验证
        int result = accessDecisionManager.vote(user, request);
        // 如果结果是通过，则返回成功信息
        if (result == AccessDecisionVoter.ACCESS_GRANTED) {
            return "添加用户成功";
        }
        // 否则返回失败信息
        return "没有权限添加用户";
    }

    private User getUser(String username, String password) {
        User user = dataProvider.getUserByUsername(username);
        // 如果用户不存在或密码不正确，返回错误信息
        if (user == null || !user.getPassword().equals(password)) {
            return null;

        }
        return user;
    }

    @RequestMapping(value = "/api/user/delete", method = RequestMethod.DELETE)
    public String deleteUser(String username, String password) {
        User user = getUser(username, password);
        if (user == null) return "用户名或密码错误";
 
       // 根据请求路径从DataProvider中获取请求对象
        Request request = dataProvider.getRequestByPath("/api/user/delete");
        // 调用AccessDecisionManager的vote方法进行权限验证
        int result = accessDecisionManager.vote(user, request);
        // 如果结果是通过，则返回成功信息
        if (result == AccessDecisionVoter.ACCESS_GRANTED) {
            return "删除用户成功";
        }
        // 否则返回失败信息
        return "没有权限删除用户";
    }
 
    @RequestMapping(value = "/api/user/update", method = RequestMethod.PUT)
    public String updateUser(String username, String password) {
        User user = getUser(username, password);
        if (user == null) return "用户名或密码错误";

        // 根据请求路径从DataProvider中获取请求对象
        Request request = dataProvider.getRequestByPath("/api/user/update");
        // 调用AccessDecisionManager的vote方法进行权限验证
        int result = accessDecisionManager.vote(user, request);
        // 如果结果是通过，则返回成功信息
        if (result == AccessDecisionVoter.ACCESS_GRANTED) {
            return "更新用户成功";
        }
        // 否则返回失败信息
        return "没有权限更新用户";
    }
}